package com.quan.admin.web.controller;

import com.quan.commons.core.bean.R;
import com.quan.commons.core.biz.support.MyBaseController;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 测试
 */
@RestController
@RequestMapping("test")
public class TestController extends MyBaseController {

    @Autowired
    private RedissonClient redissonClient;

    private static int count = 0;

    /**
     * 场景1，加锁，解锁
     * @return
     */
    @GetMapping("redisson01")
    public R testRedisson01() {
        //1、获取一把锁，锁的名称随便起，只要锁的名字相同就是同一把锁
        final RLock lock = this.redissonClient.getLock("goods");

        //2、加锁
        lock.lock();
        //1）锁的自动续期，如果业务超长，运行期间自动给锁续上30秒，不用担心业务时间长，锁自动过期被删掉
        //2）加锁的业务只要运行完成，就不会给当前锁续期，即时不手动解锁，锁默认会在30秒收自动删除
        //Redisson 不会有死锁问题

        try {
            System.out.println("第"+(count ++)+"个请求加锁成功，执行业务..." + Thread.currentThread().getId());
            Thread.sleep(3000);
        } catch (Exception e){

        } finally {
            //释放锁
            System.out.println("释放锁..." + Thread.currentThread().getId());
            lock.unlock();
        }
        return R.ok();
    }

    /**
     * 场景2：死锁
     * Redisson自己解决了死锁问题，锁超时了会自动解锁，默认30秒
     * 1）锁的自动续期，如果业务超长，运行期间自动给锁续上30秒，不用担心业务时间长，锁自动过期被删掉
     * 2）加锁的业务只要运行完成，就不会给当前锁续期，即时不手动解锁，锁默认会在30秒收自动删除
     * @return
     */
    @GetMapping("redisson02")
    public R testRedisson02() {
        //1、获取一把锁，锁的名称随便起，只要锁的名字相同就是同一把锁
        final RLock lock = this.redissonClient.getLock("goods");

        //2、加锁
        lock.lock();
        try {
            System.out.println("第"+(count ++)+"个请求加锁成功，执行业务..." + Thread.currentThread().getId());
            Thread.sleep(3000);
        } catch (Exception e){

        } finally {
            //释放锁
            System.out.println("释放锁..." + Thread.currentThread().getId());
            lock.unlock();
        }
        return R.ok();
    }

}
